/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package caintra.Sapra.Pantalla.Dispersion;

import caintra.Sapra.ComponentsImplements.CalendarPane;
import caintra.Sapra.Model.PrefacturaCaintra;
import caintra.Sapra.Model.PrefacturaDetalle;
import caintra.Sapra.Pantalla.Dispersion.Formato.Dispersion_Bancomer;
import caintra.Sapra.Pantalla.Dispersion.Formato.Dispersion_Detalle_Banorte;
import caintra.Sapra.Pantalla.Dispersion.Formato.Dispersion_Header_Banorte;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import nextapp.echo2.app.ApplicationInstance;
import nextapp.echo2.app.event.ActionEvent;
import nextapp.echo2.app.event.ActionListener;
import nextapp.echo2.app.filetransfer.Download;
import nextapp.echo2.app.filetransfer.DownloadProvider;
import nextapp.echo2.app.list.DefaultListModel;
import org.sapra.dao.Banco;



/**
 *
 * @author Luiz
 */
public class DispersionController implements ActionListener{

    public DispersionView dp_view;

    List<PrefacturaCaintra> empresa_disponible;
    ArrayList<PrefacturaCaintra> empresa_seleccionada;
    List<Banco> bancos_disponibles;
    ArrayList<PrefacturaCaintra> empresa_total;

    List<PrefacturaDetalle> lista_detalle;
    DispersionQuery query;
    PrefacturaCaintra prefactura;
    public DecimalFormat decimal=new DecimalFormat("00");
    public SimpleDateFormat formato_fecha=new SimpleDateFormat("dd-MM-yyyy");
    public int num_archivo=99;
    public Date fecha_pago;
    public Date fecha_dispersion;
    final int BANORTE=1;
    final int BANCOMER=2;
    final int OTRO_BANCO=3;
    public Banco bank;
    boolean first_time=true;



    public DispersionController() {
    }

    public DispersionController(DispersionView dp_view) {
        try {
            this.dp_view=dp_view;
            query=new DispersionQuery();
            this.dp_view.botones.setVisible(false);
            this.dp_view.detalle.setVisible(false);
            this.dp_view.dispersar.setVisible(false);
            add_ActionListener();
            execute();
        } catch (Exception e) {

        }

    }
    public void add_ActionListener(){
        dp_view.mov_der_1.addActionListener(this);
        dp_view.mov_izq_1.addActionListener(this);
        dp_view.mov_izq_todos.addActionListener(this);
        dp_view.mov_der_todos.addActionListener(this);
        dp_view.inc_num.addActionListener(this);
        dp_view.dec_num.addActionListener(this);
        dp_view.sel_banco.addActionListener(this);
        dp_view.seleccion_fecha.addActionListener(this);
        dp_view.detalle.addActionListener(this);
        dp_view.dispersar.addActionListener(this);
        dp_view.seleccion_disp.addActionListener(this);
    }


    public void execute(){
        try {
            fecha_pago=new Date();
            fecha_dispersion=new Date();
            bancos_disponibles=query.bancos_disponibles();
            if(bancos_disponibles == null || bancos_disponibles.isEmpty()){
                mensaje_error("No existen  bancos disponibles");
                return;
            }
            
            dp_view.sel_banco.setModel(new DefaultListModel(bancos_disponibles.toArray()));
            dp_view.txt_fecha.setText(formato_fecha.format(fecha_pago));
            dp_view.txt_disp_fecha.setText(formato_fecha.format(fecha_dispersion));
            dp_view.txt_fecha.setEnabled(false);
            dp_view.txt_disp_fecha.setEnabled(false);
            dp_view.txt_num_archivo.setEnabled(false);
            dp_view.detalle.setVisible(false);
            dp_view.dispersar.setVisible(false);
            dp_view.txt_num_archivo.setText(""+num_archivo);

        } catch (Exception e) {
        }
    }
    public void actualizar_listado(){
        
        try {
                if(dp_view.sel_banco.getSelectionModel().isSelectionEmpty()){

                    mensaje_error("Favor de seleccionar un banco");
                    return;
            }
            bank=(Banco)dp_view.sel_banco.getSelectedItem();

            empresa_disponible=query.empresas_autorizada(fecha_pago,bank.getbancoId());
            if(empresa_disponible.isEmpty()){
                empresa_disponible=new ArrayList<PrefacturaCaintra>();
                empresa_seleccionada=new ArrayList<PrefacturaCaintra>();
                empresa_total=new ArrayList<PrefacturaCaintra>();
                this.dp_view.botones.setVisible(false);
                dp_view.detalle.setVisible(false);
                dp_view.dispersar.setVisible(false);
                dp_view.tb_empresa_disponible.setEmpresa_Disponible(empresa_disponible, "Empresa Disponible");
                dp_view.tb_empresa_seleccionada.setEmpresa_Disponible(empresa_seleccionada, "Empresa Seleccionada");
                mensaje_error("No Existen Empresas a dispersar para este periodo");
                return;
            }
            this.dp_view.botones.setVisible(true);
            dp_view.detalle.setVisible(true);
            dp_view.dispersar.setVisible(true);
            empresa_seleccionada=new ArrayList<PrefacturaCaintra>();
            dp_view.tb_empresa_disponible.setEmpresa_Disponible(empresa_disponible, "Empresa Disponible");
            dp_view.tb_empresa_seleccionada.setEmpresa_Disponible(empresa_seleccionada, "Empresa Seleccionada");
            juntar_empresa();
        } catch (Exception e) {
            mensaje_error("Error al actualizar la lista de empresas");
            return;
        }



    }
    public void actionPerformed(ActionEvent e) {
        if(e.getActionCommand().equals("izq_1")){   uno_izquierda();   }
        if(e.getActionCommand().equals("der_1")){   uno_derecha();     }
        if(e.getActionCommand().equals("todo_izq")){ todo_izquierda(); }
        if(e.getActionCommand().equals("todo_der")){ todo_derecha();   }
        if(e.getActionCommand().equals("inc_num")){incrementar_numero();   }
        if(e.getActionCommand().equals("dec_num")){ decrementar_numero();   }
        if(e.getActionCommand().equals("banco")){   select_banco();}
        if(e.getActionCommand().equals("calendario")){   seleccion_fecha_pago();}
        if(e.getActionCommand().equals("cal_disp")){  seleccion_fecha_disp(); }
        if(e.getActionCommand().equals("detalle")){  detalle_factura(); }
        if(e.getActionCommand().equals("dispersar")){  dispersar(); }
    }


    public List<PrefacturaDetalle> lista_practicante_emp;
    public String tipo_archivo="";
    public String nombre_archivo="";
    public ArrayList<String> lineas=new ArrayList<String>();
    public void dispersar(){
        String info_archivo="";
        
        double monto_total=0.0;
        PrefacturaDetalle pd;
        Dispersion_Bancomer bancomer;
        Dispersion_Detalle_Banorte banorte_hsbc;
        DecimalFormat formato_decimal = new DecimalFormat("############.##");
        formato_decimal.setMinimumFractionDigits(2);
        formato_decimal.setMaximumFractionDigits(2);
        try {
            if(empresa_seleccionada == null || empresa_seleccionada.isEmpty()){
                mensaje_error("Favor de seleccionar empresas a dispersar");
                return;
            }

            lista_practicante_emp = query.practicante_dispersion(empresa_seleccionada);

            if(lista_practicante_emp == null || lista_practicante_emp.isEmpty()){
                    mensaje_error("No existen practicantes a dispersar");
                    return;
            }
            
            int contador=0;
            lineas=new ArrayList<String>();
            SimpleDateFormat spf=new SimpleDateFormat("yyyyMMdd");
            String rfc_txt="";
            for(int i=0;i<lista_practicante_emp.size();i++){
                try {
                        pd=(PrefacturaDetalle)lista_practicante_emp.get(i);
                        if(pd.getNeto()<=0){
                                mensaje_error("Practicante Con saldo negativo o con cero : "+pd.getNombre()+" "+pd.getPaterno()+" "+pd.getMaterno());
                                continue;
                        }

                        if(pd.getCuenta() == null || pd.getCuenta().trim().equals("")){
                                mensaje_error("Practicante Sin cuenta : "+pd.getNombre()+" "+pd.getPaterno()+" "+pd.getMaterno());
                                continue;
                                //return;
                        }else{
                            long number=Long.parseLong(pd.getCuenta());
                            if(number == 0){
                                mensaje_error("La cuenta es invalida para : "+pd.getNombre()+" "+pd.getPaterno()+" "+pd.getMaterno());
                                continue;
                                //return;
                            }
                        }
                       
                        if(info_archivo.contains(pd.getCuenta().trim())){
                                mensaje_error("Cuenta repetida para este practicante : "+pd.getNombre()+" "+pd.getPaterno()+" "+pd.getMaterno());
                                return;
                        }
                        
                         contador++;
                            String aux="";
                            if(bank.getbancoId()== 1 || bank.getbancoId()== 3){//BANORTE 1 HSBC 3
                                    banorte_hsbc=new Dispersion_Detalle_Banorte();
                                    banorte_hsbc.setBanco_receptor(bank.getbancoId());
                                    banorte_hsbc.setTipo_cuenta(bank.getbancoId());
                                    banorte_hsbc.setFecha_aplicacion(fecha_dispersion);
                                    banorte_hsbc.setImporte_empleado(formato_decimal.format(pd.getNeto()));
                                    monto_total+=pd.getNeto();
                                    banorte_hsbc.setNumero_empleado(""+pd.getPracticante_Id());
                                    banorte_hsbc.setNumero_cuenta(pd.getCuenta());
                                    aux=banorte_hsbc.toString();
                                    if(((i+1)<lista_practicante_emp.size()))
                                        aux=aux+"\r\n";
                                        //lineas.add("\r\n");

                                    lineas.add(aux);
                                    info_archivo += banorte_hsbc.toString()+"\n";

                            }
                            if(bank.getbancoId()== 2){//Bancomer

                                    bancomer=new Dispersion_Bancomer();
                                    bancomer.setConsecutivo(""+contador);
                                    bancomer.setImporte(formato_decimal.format(pd.getNeto()));
                                    monto_total+=pd.getNeto();
                                    bancomer.setNombre(""+pd.getNombre()+" "+pd.getPaterno()+" "+pd.getMaterno());
                                    rfc_txt=RFC.ProcessRFC(pd);
                                    bancomer.setRfc(rfc_txt);

                                    bancomer.setNumero(this.dp_view.txt_num_archivo.getText());
                                    bancomer.setCuenta(""+pd.getCuenta());
                                    lineas.add(bancomer.toString()+"\r\n");
                                    info_archivo += bancomer.toString()+"\r\n";

                            }
                        /*if(bank.getbancoId()== 1 || bank.getbancoId()== 3){//BANORTE 1 HSBC 3
                            banorte_hsbc=new Dispersion_Detalle_Banorte();
                            banorte_hsbc.setBanco_receptor(bank.getbancoId());
                            banorte_hsbc.setFecha_aplicacion(fecha_dispersion);
                            banorte_hsbc.setImporte_empleado(formato_decimal.format(pd.getNeto()));
                            monto_total+=pd.getNeto();
                            banorte_hsbc.setNumero_empleado(""+pd.getPracticante_Id());
                            banorte_hsbc.setNumero_cuenta(pd.getCuenta());
                            info_archivo += banorte_hsbc.toString()+"\n";
                        }
                        if(bank.getbancoId()== 2){//Bancomer
                            bancomer=new Dispersion_Bancomer();
                            bancomer.setConsecutivo(""+(i+1));
                            bancomer.setImporte(formato_decimal.format(pd.getNeto()));
                            monto_total+=pd.getNeto();
                            bancomer.setNombre(""+pd.getNombre()+" "+pd.getPaterno()+" "+pd.getMaterno());
                            //bancomer.setRfc(pd.getRfc());
                            bancomer.setCuenta(""+pd.getCuenta());
                            info_archivo += bancomer.toString()+"\n";
                        
                           
                    }*/
                } catch (Exception e) {
                        mensaje_error("Error al momento de generar la dispersion ");
                        return;
                }
            }
            if(monto_total<=0){
                    mensaje_error("Monto Total igual a 0 ");
                        return;
            }
            info_archivo = null;
            if(bank.getbancoId()== 1 || bank.getbancoId()== 3){//BANORTE
                tipo_archivo=".PAG";
                nombre_archivo="NI34954"+this.dp_view.txt_num_archivo.getText()+""+tipo_archivo;
                Dispersion_Header_Banorte head=new Dispersion_Detalle_Banorte();
                head.setConsecutivo(this.dp_view.txt_num_archivo.getText());
                head.setFecha_Proceso(fecha_dispersion);
                head.setTotal_Importe(formato_decimal.format(monto_total));
                head.setTotal_Registros(""+contador);
                info_archivo=head.cadena();
                //info_archivo
            }
            if(bank.getbancoId()== 2){//Bancomer
                tipo_archivo=".TXT";
                nombre_archivo="PAGO"+tipo_archivo;
            }
            Writer w=new OutputStreamWriter(new FileOutputStream("C:/Users/develop/Documents/DocsSapra/PAGO.txt"), "UTF-8");
            //Writer w=new OutputStreamWriter(new FileOutputStream("/opt/innoapps/ALT/PAGO.txt"), "UTF-8");
             //Writer w=new OutputStreamWriter(new FileOutputStream("/home/cobain/Escritorio/PAGO.txt"), "UTF-8");

            //f.createNewFile();
            //BufferedWriter bw=new BufferedWriter(new FileWriter(f));
            //
            //bw.flush();
            
            if(info_archivo != null){
                    w.write(info_archivo+"\r\n");
                    
            }
            String linea="";
            for(int i=0;i<lineas.size();i++){
               linea=(String)lineas.get(i);
               w.write(linea);
            }
            //bw.write(info_archivo);
            //bw.flush();
            w.close();
            //File f=new File("/home/cobain/Escritorio/PAGO.txt");
            File f=new File("C:/Users/develop/Documents/DocsSapra/PAGO.txt");
            //File f=new File("/opt/innoapps/ALT/PAGO.txt");
            final byte[] content = new byte[(int) f.length()];
            FileInputStream inputStream = new FileInputStream(f);
            inputStream.read(content);
            inputStream.close();
            Download archivo=new Download();
            archivo.setProvider(new DownloadProvider() {

                                public String getContentType() {
                                            return tipo_archivo;
                                        }

                                        public String getFileName() {
                                            return nombre_archivo;
                                        }

                                        public int getSize() {
                                            return 0;
                                        }

                                        public void writeFile(OutputStream out) throws IOException {
                                            out.write(content);
                                        }
                                    });
            archivo.setActive(true);
            ApplicationInstance app = ApplicationInstance.getActive();
            app.getActive().enqueueCommand(archivo);



            
        } catch (Exception e) {
        }
    }
    public void detalle_factura(){
        try {
            if(empresa_total == null || empresa_total.isEmpty()){
                mensaje_error("No Existen empresas disponibles");
                return;
            }
            dp_view.detail_window.setContentPane(new Dispersion_Detalle(this));
            this.dp_view.add(dp_view.detail_window);
        } catch (Exception e) {
        }

    }
    public void seleccion_fecha_pago(){
            try {
                dp_view.calendar_window.setContentPane(new CalendarPane(this,1));
                this.dp_view.add(dp_view.calendar_window);
                first_time=true;
        } catch (Exception e) {
        }

    }
    public void seleccion_fecha_disp(){
            try {
                dp_view.calendar_window.setContentPane(new CalendarPane(this,2));
                this.dp_view.add(dp_view.calendar_window);
        } catch (Exception e) {
        }

    }

    public void select_banco(){
        try {
            first_time=true;
            actualizar_listado();
        } catch (Exception e) {
        }

    }

    public void uno_derecha(){
        int id=0;
        try {
            if(empresa_disponible.isEmpty()){

                mensaje_error("No tiene ninguna empresa disponible para seleccionar");
                return;

            }
            if(! dp_view.tb_empresa_disponible.getSelectionModel().isSelectionEmpty()){
                id = dp_view.tb_empresa_disponible.getSelectionModel().getMinSelectedIndex();
                prefactura=(PrefacturaCaintra)empresa_disponible.get(id);
                empresa_seleccionada.add(prefactura);
                empresa_disponible.remove(id);
                Collections.sort(empresa_seleccionada);
                Collections.sort(empresa_disponible);
                dp_view.tb_empresa_disponible.setEmpresa_Disponible(empresa_disponible, "Empresa Disponible");
                dp_view.tb_empresa_seleccionada.setEmpresa_Disponible(empresa_seleccionada, "Empresa Seleccionada");
                
                if(empresa_disponible.size()<=0){
                    dp_view.tb_empresa_disponible.getSelectionModel().clearSelection();
                    juntar_empresa();
                }
            }else{
                mensaje_error("Favor de Seleccionar una empresa disponible");
                return;
            }
        } catch (Exception e) {
        }
    }
    public void todo_derecha(){
        try {
            if(empresa_disponible.isEmpty()){

                mensaje_error("No tiene ninguna empresas disponible para dispersar");
                return;

            }
            empresa_seleccionada.addAll(empresa_disponible);
            Collections.sort(empresa_seleccionada);
            empresa_disponible.clear();
            dp_view.tb_empresa_disponible.setEmpresa_Disponible(empresa_disponible, "Empresa Disponible");
            dp_view.tb_empresa_seleccionada.setEmpresa_Disponible(empresa_seleccionada, "Empresa Seleccionada");
            dp_view.tb_empresa_seleccionada.getSelectionModel().clearSelection();
            dp_view.tb_empresa_disponible.getSelectionModel().clearSelection();
            juntar_empresa();

        } catch (Exception e) {
        }

    }
    public void uno_izquierda(){
        int id=0;
        try {
            if(empresa_seleccionada.isEmpty()){

                mensaje_error("No tiene ninguna empresa seleccionada para quitar de la dispersion");
                return;

            }
            if(! dp_view.tb_empresa_seleccionada.getSelectionModel().isSelectionEmpty()){
                    id = dp_view.tb_empresa_seleccionada.getSelectionModel().getMinSelectedIndex();
                    prefactura=(PrefacturaCaintra)empresa_seleccionada.get(id);
                    empresa_disponible.add(prefactura);
                    empresa_seleccionada.remove(id);
                    Collections.sort(empresa_seleccionada);
                    Collections.sort(empresa_disponible);
                    dp_view.tb_empresa_disponible.setEmpresa_Disponible(empresa_disponible, "Empresa Disponible");
                    dp_view.tb_empresa_seleccionada.setEmpresa_Disponible(empresa_seleccionada, "Empresa Seleccionada");
                    if(empresa_seleccionada.size()<=0){
                        dp_view.tb_empresa_seleccionada.getSelectionModel().clearSelection();
                    }
                    juntar_empresa();
            }else{
                mensaje_error("Favor de Seleccionar una empresa para quitar de la dispersion");
                return;
            }
        } catch (Exception e) {
        }

    }
    public void todo_izquierda(){
        try {
            if(empresa_seleccionada.isEmpty()){

                mensaje_error("No tiene  empresas para quitar de la dispersion");
                return;

            }
            empresa_disponible.addAll(empresa_seleccionada);
            Collections.sort(empresa_disponible);
            empresa_seleccionada.clear();
            dp_view.tb_empresa_disponible.setEmpresa_Disponible(empresa_disponible, "Empresa Disponible");
            dp_view.tb_empresa_seleccionada.setEmpresa_Disponible(empresa_seleccionada, "Empresa Seleccionada");
            dp_view.tb_empresa_seleccionada.getSelectionModel().clearSelection();
            dp_view.tb_empresa_disponible.getSelectionModel().clearSelection();
            juntar_empresa();
        } catch (Exception e) {
        }

    }
    public void incrementar_numero(){
        try {
            num_archivo++;
            if(num_archivo>=100)
                num_archivo=1;
            dp_view.txt_num_archivo.setText(""+decimal.format(num_archivo));
        } catch (Exception e) {
            num_archivo=99;
            dp_view.txt_num_archivo.setText(""+decimal.format(num_archivo));
        }
    }
    public void decrementar_numero(){
        try {
            num_archivo--;
            if(num_archivo<=0)
                num_archivo=99;
            dp_view.txt_num_archivo.setText(""+decimal.format(num_archivo));
        } catch (Exception e) {
            num_archivo=99;
            dp_view.txt_num_archivo.setText(""+decimal.format(num_archivo));
        }
    }

    
    public void mensaje_error(String msj){
        try {
            this.dp_view.message_window.setVisible(true);
            this.dp_view.add(this.dp_view.message_window);
            this.dp_view.message_window.mensaje_Panel(msj);

        } catch (Exception e) {
        }


    }

    public void juntar_empresa(){
        empresa_total=new ArrayList<PrefacturaCaintra>();
        if(empresa_seleccionada != null || ! empresa_seleccionada.isEmpty())
            empresa_total.addAll(empresa_seleccionada);

        if(empresa_disponible != null || ! empresa_disponible.isEmpty())
            empresa_total.addAll(empresa_disponible);

        Collections.sort(empresa_total);

    }

}
